<?php
function getPubCycle($bdd) {
	////////////////////////////
	//// 1- Calcul du cycle ////
	////////////////////////////
	
	// On récupère l'enseigne ayant le plus de publicités d'enseignes différentes
	$Nb_Max_Pub_E = $bdd->query('SELECT ens_id, count(pub_id) FROM pub where pub_type = \'E\' GROUP BY ens_id ORDER BY count(pub_id) DESC')->fetch(PDO::FETCH_ASSOC);
	// On récupère le nombre d'enseignes ayant un compte Plus
	$Nb_Enseigne_Plus = $bdd ->query('SELECT count(*) FROM enseigne WHERE ens_type_cpt >= 3')->fetch(PDO::FETCH_ASSOC);
	// On récupère l'enseigne ayant le plus de publicités détaillée différentes
	$Nb_Max_Pub_D = $bdd->query('SELECT ens_id, count(pub_id) FROM pub WHERE pub_type = \'D\' GROUP BY ens_id ORDER BY count(pub_id) DESC')->fetch(PDO::FETCH_ASSOC);
	// On récupère le nombre d'enseignes ayant un compte Premium
	$Nb_Enseigne_Premium = $bdd ->query('SELECT count(*) FROM enseigne WHERE ens_type_cpt = 4')->fetch(PDO::FETCH_ASSOC);
	
	// Calcul du temps nécessaire pour que chaques pub d'enseigne passe au moins une fois (on multiplie par 3 pour comparer ce cycle avec celui des pubs détaillées car les pubs détaillées sont affichées 3x plus souvent).
	$Cycle_E = $Nb_Max_Pub_E['count(pub_id)'] * $Nb_Enseigne_Plus['count(*)'] * 3;
	// Calcul du temps nécessaire pour que chaques pubs détaillées passe au moins une fois.
	$Cycle_D = $Nb_Max_Pub_D['count(pub_id)'] * $Nb_Enseigne_Premium['count(*)'];
	
	// Ces cycles correspondent à des cycles de pubs détaillées. On prend le cycle le plus long et on ajout le cycle d'enseigne correspondant
	if ($Cycle_E > $Cycle_D)
	{
	// $Cycle_Pub = $Cycle_E + $Cycle_E * 1/3
		$Cycle_Pub = $Cycle_E *4/3;
	}
	else
	{
		$Cycle_Pub = $Cycle_D *4/3;
	}
	// On connait le cycle, il faut maintenant connaître toutes les pubs à afficher.
	
	///////////////////////////////
	//// 2- Sélection des pubs ////
	///////////////////////////////
	
		//////////////////////////////////////////////
		// SELECTION DES PUBS D'ENSEIGNE A AFFICHER //
		//////////////////////////////////////////////
	
	// Sélection de toutes les pubs de type 'Enseigne'
	$Id_Pub_E = 'SELECT ens_id, pub_id FROM pub WHERE pub_type = \'E\' ';
	$Id_1_ENS_E = $bdd->query('SELECT ens_id, pub_id FROM pub WHERE pub_type = \'E\' ')->fetch(PDO::FETCH_ASSOC);
	
	// $Nb_Pub_Par_E = nombre de pub de type 'Enseigne' qu'y doit être affiché pour chaque enseigne.
	// Les pubs d'enseigne représente 1/4 des pubs du cycle. Qui doit être répartie entre chaque enseigne.
	$Nb_Pub_E_Par_E = $Cycle_Pub / (4*$Nb_Enseigne_Plus['count(*)']);
		
	$i = $Nb_Pub_E_Par_E;

	// Compteur d'enseigne
	$Numero_Enseigne = 1;
	    
    // On enregistre l'id de la première enseigne pour être au courant lorsque l'on change d'enseigne
	$enseigne = $Id_1_ENS_E['ens_id'];
    
	// On parcourt toutes les pubs de type 'Enseigne'
    foreach($bdd->query($Id_Pub_E) as $Pub_E)
	{
        // Tant qu'on est sur la même enseigne
		if ($enseigne == $Pub_E['ens_id'])
		{
			// On enregistre l'id de la pub dans un tableau
 			$Tab_Pub[] = $Pub_E['pub_id'];
			// On décrémente le compteur du nombre de pubs à afficher pour cette enseigne
			$i = $i-1;
		}
		// On change d'enseigne
		else
		{
            // indice du tableau de la première pub à rajouter de l'enseigne précédente.
			$j = $Nb_Pub_E_Par_E * ($Numero_Enseigne-1);
			// On regarde si on a mis suffisamment de pub Enseigne pour l'enseigne précédente.
			while($i > 0)
			{
                // A la suite des pub d'enseigne déjà mise, on rajoute les pubs déjà mise pour l'enseigne précédente afin d'arriver au bon nombre de pub d'enseigne pour cette enseigne.
				$Tab_Pub[] = $Tab_Pub[$j];
				// On décrémente le nombre de pub d'enseigne à ajouter
				$i = $i-1;
				// On incrémente la prochaine pub déjà mise à ajouter
				$j = $j+1;
			}
			// On réinitialise le compteur de pub d'enseigne à ajouter.
			$i = $Nb_Pub_E_Par_E;
			// On enregistre l'id de l'enseigne en cours
			$enseigne = $Pub_E['ens_id'];
			// On incrémente le nombre d'enseigne parcouru
			$Numero_Enseigne = $Numero_Enseigne +1;
			// On ajoute la pub d'enseigne de la nouvelle enseigne sur laquelle on est positionnée.
			$Tab_Pub[] = $Pub_E['pub_id'];
			// On décrémente le compteur du nombre de pubs à afficher pour cette enseigne
			$i = $i-1;
		}
	}
	$j = $Nb_Pub_E_Par_E * ($Numero_Enseigne-1);
    while ($i > 0)
    {
        // A la suite des pub d'enseigne déjà mise, on rajoute les pubs déjà mise pour l'enseigne précédente afin d'arriver au bon nombre de pub d'enseigne pour cette enseigne.
		$Tab_Pub[] = $Tab_Pub[$j];
		// On décrémente le nombre de pub d'enseigne à ajouter
		$i = $i-1;
		// On incrémente la prochaine pub déjà mise à ajouter
		$j = $j+1;
    }
    
	// On a ajouté toutes les pubs d'enseigne, on récupère le dernier indice du tableau, on ajoute maintenant les pubs détaillées.
	
		//////////////////////////////////////////////
		// SELECTION DES PUBS DETAILLEES A AFFICHER //
		//////////////////////////////////////////////
	
	// Sélection de toutes les pubs de type 'Détaillée'
	$Id_Pub_D = 'SELECT ens_id, pub_id FROM pub WHERE pub_type = \'D\' ';
    $Id_1_Ens_D = $bdd->query('SELECT ens_id, pub_id FROM pub WHERE pub_type = \'D\' ')->fetch(PDO::FETCH_ASSOC);
	
	// $Nb_Pub_Par_D = nombre de pub de type 'Détaillée' qu'y doit être affiché pour chaque enseigne.
	// Les pubs détaillée représente 3/4 des pubs du cycle. Qui doit être répartie entre chaque enseigne.
	$Nb_Pub_D_Par_E = $Cycle_Pub*3/4 /$Nb_Enseigne_Premium['count(*)'];
	
	// On enregistre l'id de la première enseigne pour être au courant lorsque l'on change d'enseigne
	$enseigne = $Id_1_Ens_D['ens_id'];
	
	$i = $Nb_Pub_D_Par_E;
	
	// Compteur d'enseigne
	$Numero_Enseigne = 1;
	

    $Nb_Pub_Deja_Enr = sizeof($Tab_Pub);

      
	// On parcourt toutes les pubs de type 'Enseigne'
    foreach($bdd->query($Id_Pub_D) as $Pub_D)
	{
		// Tant qu'on est sur la même enseigne
		if ($enseigne == $Pub_D['ens_id'])
		{
			// On enregistre l'id de la pub dans un tableau
			$Tab_Pub[] = $Pub_D['pub_id'];
			// On décrémente le compteur du nombre de pubs à afficher pour cette enseigne
			$i = $i-1;
		}
		// On change d'enseigne
		else
		{
			// indice du tableau de la première pub à rajouter de l'enseigne précédente.
			$j = $Nb_Pub_D_Par_E * ($Numero_Enseigne -1) + $Nb_Pub_Deja_Enr;
			// On regarde si on a mis suffisamment de pub Enseigne pour l'enseigne précédente.
			while($i > 0)
			{
				// A la suite des pub d'enseigne déjà mise, on rajoute les pubs déjà mise pour l'enseigne précédente afin d'arriver au bon nombre de pub d'enseigne pour cette enseigne.
				$Tab_Pub[] = $Tab_Pub[$j];
				// On décrémente le nombre de pub d'enseigne à ajouter
				$i = $i-1;
				// On incrémente la prochaine pub déjà mise à ajouter
				$j = $j+1;
			}
			// On réinitialise le compteur de pub d'enseigne à ajouter.
			$i = $Nb_Pub_D_Par_E;
			// On enregistre l'id de l'enseigne en cours
			$enseigne = $Pub_D['ens_id'];
			// On incrémente le nombre d'enseigne parcouru
			$Numero_Enseigne = $Numero_Enseigne +1;
			// On ajoute la pub s'enseigne de la nouvelle enseigne sur laquelle on est positionnée.
			$Tab_Pub[] = $Pub_D['pub_id'];
			// On décrémente le compteur du nombre de pubs à afficher pour cette enseigne
			$i = $i-1;
		}
	}
	$j = $Nb_Pub_D_Par_E * ($Numero_Enseigne-1) + $Nb_Pub_Deja_Enr;
    while ($i > 0)
    {
        // A la suite des pub d'enseigne déjà mise, on rajoute les pubs déjà mise pour l'enseigne précédente afin d'arriver au bon nombre de pub d'enseigne pour cette enseigne.
		$Tab_Pub[] = $Tab_Pub[$j];
		// On décrémente le nombre de pub d'enseigne à ajouter
		$i = $i-1;
		// On incrémente la prochaine pub déjà mise à ajouter
		$j = $j+1;
    }
	
	// On a remplit le tableau avec les ID des pubs dans l'ordre. On va reprendre toutes ces ID dans un autre tableau avec un ordre "aléatoire".
		///////////////////////////////
		// ORDONNANCEMENT DU TABLEAU //
		///////////////////////////////
	
	shuffle($Tab_Pub);
	
	return $Tab_Pub;
}
?>